package demo17;

import java.util.ArrayList;
import java.util.List;

/*
给定一个仅包含数字 2-9 的字符串，返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下（与电话按键相同）。注意 1 不对应任何字母。

 */
public class Test {
    public static void main(String[] args) {
        System.out.println(letterCombinations("322452"));
    }


    public static List<String> letterCombinations(String digits) {
        List<String> list = new ArrayList<>();
        if(digits.length() == 0){
            return list;
        }else{
            charCombine(list,digits,"",0);
        }
        return list;
    }


    /*
        使用递归完成字母的组合
        list：存取最终结果的集合；
        str：原字符串的长度；
        sb：用来保存前面的递归路程中所选择的字符
        start：当前读取到字符串的下标；
     */
    public static void charCombine(List<String> list, String str, String result, int start){
        switch(str.charAt(start)){
            case '2':
                if(start == str.length()-1){
                    //递归终点
                    list.add(result+"a");
                    list.add(result+"b");
                    list.add(result+"c");
                }else{
                    charCombine(list,str,result+"a",start+1);
                    charCombine(list,str,result+"b",start+1);
                    charCombine(list,str,result+"c",start+1);
                }
                break;
            case '3':
                if(start == str.length()-1){
                    //递归终点
                    list.add(result+"d");
                    list.add(result+"e");
                    list.add(result+"f");
                }else{
                    charCombine(list,str,result+"d",start+1);
                    charCombine(list,str,result+"e",start+1);
                    charCombine(list,str,result+"f",start+1);
                }
                break;
            case '4':
                if(start == str.length()-1){
                    //递归终点
                    list.add(result+"g");
                    list.add(result+"h");
                    list.add(result+"i");
                }else{
                    charCombine(list,str,result+"g",start+1);
                    charCombine(list,str,result+"h",start+1);
                    charCombine(list,str,result+"i",start+1);
                }
                break;
            case '5':
                if(start == str.length()-1){
                    //递归终点
                    list.add(result+"j");
                    list.add(result+"k");
                    list.add(result+"l");
                }else{
                    charCombine(list,str,result+"j",start+1);
                    charCombine(list,str,result+"k",start+1);
                    charCombine(list,str,result+"l",start+1);
                }
                break;
            case '6':
                if(start == str.length()-1){
                    //递归终点
                    list.add(result+"m");
                    list.add(result+"n");
                    list.add(result+"o");
                }else{
                    charCombine(list,str,result+"m",start+1);
                    charCombine(list,str,result+"n",start+1);
                    charCombine(list,str,result+"o",start+1);
                }
                break;
            case '7':
                if(start == str.length()-1){
                    //递归终点
                    list.add(result+"p");
                    list.add(result+"q");
                    list.add(result+"r");
                    list.add(result+"s");
                }else{
                    charCombine(list,str,result+"p",start+1);
                    charCombine(list,str,result+"q",start+1);
                    charCombine(list,str,result+"r",start+1);
                    charCombine(list,str,result+"s",start+1);
                }
                break;
            case '8':
                if(start == str.length()-1){
                    //递归终点
                    list.add(result+"t");
                    list.add(result+"u");
                    list.add(result+"v");
                }else{
                    charCombine(list,str,result+"t",start+1);
                    charCombine(list,str,result+"u",start+1);
                    charCombine(list,str,result+"v",start+1);
                }
                break;
            case '9':
                if(start == str.length()-1){
                    //递归终点
                    list.add(result+"w");
                    list.add(result+"x");
                    list.add(result+"y");
                    list.add(result+"z");
                }else{
                    charCombine(list,str,result+"w",start+1);
                    charCombine(list,str,result+"x",start+1);
                    charCombine(list,str,result+"y",start+1);
                    charCombine(list,str,result+"z",start+1);
                }
                break;
        }
    }

}
